/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package util;

import util.print.printLogCat;

/**
 * 字节数据读取类,传人一个字节数组,可以对这一个数组进行任意读取
 * 1.通过skip偏移量顺序读取
 * 2.通过mark书签返回书签读取
 * 3.对指定位置进行读取
 * 如果读取错误将报错,包括数组下标溢出
 * @author 梁前武 QQ1587790525
 */
public  class readData {
    /**
     * 数据包
     */
   private byte[] data;
   /**
    * 数组书签
    * 
    */
   private  int mark=0;
   /**
    * 数组偏移量
    * 一般在上一次读取数据的最后一个下标处
    */
   private int skip=0;
   /**
    * 上一次读取数据的最后一个位置
    */
   private int proSkip=0;
   
   public readData(byte[] data){
         this.data = data;
   }
   /**
    * 从偏移量开始读取b数组长度的数据到数组b中
    * 
    * @param b 字符数组
    * @return  0成功 1读取失败(数组下标已越界)
    */
    public int read(byte b[]){
        if(data.length>=skip+b.length){
            System.arraycopy(data,skip, b,0,b.length);
            skip+=b.length;
            this.proSkip=skip;
            return 0;
        }else{
            printLogCat.printlnWriter("can,t read index is overstep");
            return 1;
        }
        
    }
    /**
     *从指定位置处读取d长度的数据
     * @param d 字节数组
     * @param str 开始读取的位置
     * @return 0成功 1失败
     */
   public int read(byte[] d,int str){
        if(this.getLength()>=d.length+str){
              this.setSkip(str);
              if(read(d)==0)
              return 0;
              else
              return 1;    
         }else{
              printLogCat.printlnWriter("can,t read index is overstep");
              return 1;
         }
   }
  
   /**
    * 读取数组中从指定位置处的length给字节 并且返回这个结果数组
    * @param str
    * @param length
    * @return 
    */
   public byte[] read(int str ,int length){
        byte[] data=new byte[length];
        if(this.read(data, str)==0) 
              return data;
        else
              return null; 
   }
   
   /**
     * 设置偏移量位置 如果
     * @param skip
     * @return 0成功 1失败
     */
   public int setSkip(int skip){
        if(this.getLength()>skip){
             this.skip=skip;
             return 0;
        }else{
             return 1;
        }
   }
    /**
     * 设置书签位置 如果
     * @param mark
     * @return 0成功 1失败
     */
    public int setMark(int mark){
        if(this.getLength()>mark){
             this.mark=mark;
             return 0;
        }else{
             return 1;
        }
        
    }
    /**
     * 返回书签位置
     * @return 
     */
    public int getMark(){
        return this.mark;
    }
    
    public void moveToMark(){
        this.skip=this.mark;
    }
    /**
     * 获取前一次读取数据的最后位置
     * @return 
     */
    public int getProSkip(){
        return this.proSkip;
    }
    /**
     * 
     * @param data 
     */
    public void setData(byte[] data) {
        this.data = data;
    }
    /**
     * 
     * @param data 
     */
    public byte[] getData() {
        return  data;
    }
    /**
     * 获取本操作类的长度,如果数组为空则返回-1
     * @return  length
     */
    public int getLength(){
        if(data!=null){
             return data.length;
        }else{
             return -1;
        }
    }
}
